JSON の整形・加工に便利な jq コマンドの使い方

便利ワザ

JSON データを自由に加工・整形できるのが jq コマンドです。

REST API の開発時など、JSON データを取り扱う際に便利に使えます。
今回は、jq コマンドのオプションや活用事例について解説します。

jq のインストール手順(CentOS)
jq コマンド応用編



jq コマンドとは

jq コマンドとは、JSON データを加工するためのコマンドです。
次のような操作が簡単に行なえます。

  • インデントや改行を追加して可読性を高める
  • 任意の項目のみを抽出する
  • JSON内のキー一覧を取得する
  • 最大値・最小値・合計・平均などの集計を行う

 
今回は、以下の JSON をサンプルデータとして使用しました。

$ cat json.txt
{"update":"2018-10-10 22:00:00","items":[{"id":1,"name":"apple","price":200},{"id":2,"name":"grape","price":300},{"id":3,"name":"melon","price":900}]}

jq コマンドでインデントと改行を付加する

整形するために、jq . を実行します。ドット . がデータの先頭(最上位)を意味します。
インデントと改行が追加されて読みやすくなりました。

$ cat json.txt | jq .
{
  "items": [
    {
      "price": 200,
      "name": "apple",
      "id": 1
    },
    {
      "price": 300,
      "name": "grape",
      "id": 2
    },
    {
      "price": 900,
      "name": "melon",
      "id": 3
    }
  ],
  "update": "2018-10-10 22:00:00"
}

jq コマンドで特定の項目のみを抽出する

必要な項目が限られている場合は、jq コマンドで絞り込めます。
update だけを取り出すには .update を指定します。

$ cat json.txt | jq .update
"2018-10-10 22:00:00"

配列のデータを指定することも可能です。items の3つ目を取り出す例です。
(※配列は「0番目」から始まるため、3つ目の要素は2番となります。)

$ cat json.txt | jq .items[2]
{
  "price": 900,
  "name": "melon",
  "id": 3
}

複数の階層でも一度に指定できます。items の3つ目から name だけを取り出す例です。

$ cat json.txt | jq .items[2].name
"melon"

ダブルクォーテーションが不要な場合は -r で取り除けます。

$ cat json.txt | jq -r .items[2].name
melon

JSON内のキー一覧を取得する

取り出したいキーを確認するためには -c paths オプションが利用できます。
JSONに含まれるキーを全てまとめて確認可能です。

$ cat json.txt | jq -c paths
["update"]
["items"]
["items",0]
["items",0,"id"]
["items",0,"name"]
["items",0,"price"]
["items",1]
["items",1,"id"]
["items",1,"name"]
["items",1,"price"]
["items",2]
["items",2,"id"]
["items",2,"name"]
["items",2,"price"]

jq コマンドでデータを集計する

items の中にある price を全て合計する例を紹介します。
まずは price だけを一括で取り出します。

$ cat json.txt | jq .items[].price
200
300
900
500

取り出した値をひとまとめにするため、全体を配列で囲みます。

$ cat json.txt | jq [.items[].price]
[
  200,
  300,
  900,
  500
]

次に、抽出した配列を add に受け渡すことで合計を算出します。
パイプ記号 | を使うことで、1つの JSON に対して複数回の jq を実行可能です。

$ cat json.txt | jq "[.items[].price] | add"
1900

まとめ

JSON データの加工に便利な jq コマンドについて解説しました。

今回ピックアップした機能以外にも、非常に多くの柔軟な加工方法が利用できます。
シェルスクリプトとの相性も非常に良いため、JSON データを扱う際にはぜひ活用ください。

【関連記事】
jq コマンドの活用(応用編)
jq コマンドのインストール手順 (CentOS)
MySQL のクエリ結果を整形するコマンド
curl で POST リクエストを送信する方法
CentOS 6 と CentOS 7 のコマンド比較
Apache アクセスログを解析するコマンド